Fix PR#25973 : 'basic_string::assign(InputIt, InputIt) doesn't provide the strong exception safety guarantee'. This turned out to be a pervasive problem in <string>, which required a fair amount of rework. Add in an optimization for when iterators provide noexcept increment/comparison/assignment/dereference (which covers many of the iterators in libc++). Reviewed as http://reviews.llvm.org/D15862 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@257682 91177308-0d34-0410-b5e6-96231b3b80d8 
diff --git a/include/iterator b/include/iterator index 8dd6bd5..8d9b311 100644 --- a/include/iterator +++ b/include/iterator 
@@ -437,6 +437,12 @@  template <class _Tp>  struct __is_random_access_iterator : public __has_iterator_category_convertible_to<_Tp, random_access_iterator_tag> {};   +template <class _Tp> +struct __is_exactly_input_iterator + : public integral_constant<bool,  + __has_iterator_category_convertible_to<_Tp, input_iterator_tag>::value &&  +	!__has_iterator_category_convertible_to<_Tp, forward_iterator_tag>::value> {}; +  template<class _Category, class _Tp, class _Distance = ptrdiff_t,  class _Pointer = _Tp*, class _Reference = _Tp&>  struct _LIBCPP_TYPE_VIS_ONLY iterator @@ -1404,6 +1410,23 @@  return __x;  }   +template <class _Iter> +struct __libcpp_is_trivial_iterator +	: public _LIBCPP_BOOL_CONSTANT(is_pointer<_Iter>::value) {}; + +template <class _Iter> +struct __libcpp_is_trivial_iterator<move_iterator<_Iter> > +	: public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {}; + +template <class _Iter> +struct __libcpp_is_trivial_iterator<reverse_iterator<_Iter> > +	: public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {}; + +template <class _Iter> +struct __libcpp_is_trivial_iterator<__wrap_iter<_Iter> > +	: public _LIBCPP_BOOL_CONSTANT(__libcpp_is_trivial_iterator<_Iter>::value) {}; + +  template <class _Tp, size_t _Np>  inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11  _Tp*